//
// Created by F1997 on 2025/2/7.
//

#ifndef CPPSTUDYPROJECTV3_SAFEQUEUETEMPLATE_H
#define CPPSTUDYPROJECTV3_SAFEQUEUETEMPLATE_H

#include <queue>
#include <mutex>
#include <condition_variable>

// 线程安全的共享队列
template<typename T>
class SafeQueue {
private:
    std::queue<T> queue;
    std::mutex mutex;
    std::condition_variable cond;


public:
    // 添加元素到队列
    void enqueue(T value) {
        std::lock_guard<std::mutex> lock(mutex);
        queue.push(std::move(value));
        cond.notify_one(); // 唤醒一个等待的线程
    }

    // 从队列中移除并返回元素
    T dequeue() {
        std::unique_lock<std::mutex> lock(mutex);
        cond.wait(lock, [this]{ return !queue.empty(); }); // 等待队列不为空，否则阻塞等待
        T value = std::move(queue.front()); // 移除并返回队列的第一个元素
        queue.pop(); // 移除第一个元素
        return value;
    }

    // 从队列中移除并返回元素，如果队列为空则返回一个默认构造的 T 对象
    T tryQequeue() {
        std::unique_lock<std::mutex> lock(mutex);
        if (queue.empty()) {
            return T{}; // 返回一个默认构造的 T 对象
        }
        T value = std::move(queue.front()); // 移除并返回队列的第一个元素
        queue.pop(); // 移除第一个元素
        return value;
    }

    // 获取队列大小
    size_t getSize() {
        std::lock_guard<std::mutex> lock(mutex);
        return queue.size();
    }

    // 判断队列是否为空
    bool isEmpty() {
        std::lock_guard<std::mutex> lock(mutex);
        return queue.empty();
    }
};

#endif //CPPSTUDYPROJECTV3_SAFEQUEUETEMPLATE_H
